package com.itfreer.data.general;

import android.content.Context;

import java.util.HashMap;
import java.util.List;

/**
 * 定义ITable对象
 */
public interface ITable extends ITableInfo {

	/**
	 * 获取当前表空间
	 * 
	 * @return
	 */
	IWorkspace getWorkspace();

	/**
	 * 获取当前元数据表空间
	 */
	ITableFactory getTableFactory();

	/**
	 * 开始编辑
	 */
	void startEditing();

	/**
	 * 停止编辑
	 * 
	 * @param saveEdits
	 */
	void stopEditing(boolean saveEdits);

	/**
	 * 当前是否处于编辑状态
	 * 
	 * @return
	 */
	boolean getIsBeingEdited();

	/**
	 * 执行SQL语句返回查询结果object
	 * 
	 * @param queryFilter
	 * @return
	 */
	Object getExecuteScalar(IQueryMap queryFilter);

	/**
	 * 将数据绑定到自定义数据类型上
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> T getEntity(Class<T> c, IQueryMap queryFilter);

	/**
	 * 将数据绑定到自定义数据类型上
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> List<T> getEntityList(Class<T> c, IQueryMap queryFilter);

	/**
	 * 分页查询
	 * 
	 * @param queryFilter
	 * @return
	 */
	<T extends RowBase> List<T> pageSelect(Class<T> c, IQueryMap queryFilter);

	/**
	 * 获取某列的最大值
	 * 
	 * @param fieldName
	 * @return
	 */
	long getSpecFieldMaxValue(String fieldName, HashMap<String, Object> where);

	/**
	 * 获取某列的最小值
	 * 
	 * @param fieldName
	 * @return
	 */
	long getSpecFieldMinValue(String fieldName, HashMap<String, Object> where);

	/**
	 * 获取下一个要素，如果没有返回null
	 * 
	 * @param t
	 * @param byFieldName
	 * @param orderByType
	 * @param addCaptionField
	 * @return
	 */
	<T extends RowBase> T getNextEntity(Class<T> c, RowBase t, String byFieldName, HashMap<String, Object> whereMap,
                                        OrderByType orderByType, boolean addCaptionField);

	/**
	 * 获取上一个要素，如果没有返回null
	 * 
	 * @param t
	 * @param byFieldName
	 * @param orderByType
	 * @param addCaptionField
	 * @return
	 */
	<T extends RowBase> T getPerEntity(Class<T> c, RowBase t, String byFieldName, HashMap<String, Object> whereMap,
                                       OrderByType orderByType, boolean addCaptionField);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	void save(RowBase entity);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	<T extends RowBase> void save(List<T> entity);
	
	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	void insert(RowBase entity);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	<T extends RowBase> void insert(List<T> entity);
	
	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	void update(RowBase entity);

	/**
	 * 更新或添加行
	 * 
	 * @param entity
	 * @return
	 */
	<T extends RowBase> void update(List<T> entity);

	/**
	 * 更新数据
	 * 
	 * @param updateFilter
	 */
	void update(IUpdateMap updateFilter);

	/**
	 * 删除表记录
	 * 
	 * @param queryFilter
	 */
	void delete(IQueryMap queryFilter);

	/**
	 * 删除记录行
	 */
	void delete(String guid);
	
	/**
	 * 删除记录行
	 */
	void delete(List<String> guid);

	/**
	 * 添加字段
	 * 
	 * @param field
	 */
	void addField(Field field);

	/**
	 * 移除字段
	 * 
	 * @param field
	 */
	void removeField(Field field);

	/**
	 * 更新字段
	 * 
	 * @param field
	 */
	void updateField(Field field);
}